package text

import (
	"fmt"
	"math"
	"strings"
)

func test() {
	text1 := "这是一段文本示例"
	text2 := "另一段文本示例"

	// 将文本转换为小写并去除标点符号和空格
	text1 = strings.ToLower(text1)
	text2 = strings.ToLower(text2)
	text1 = strings.ReplaceAll(text1, " ", "")
	text2 = strings.ReplaceAll(text2, " ", "")

	// 计算余弦相似度
	cosineSimilarity := calculateCosineSimilarity(text1, text2)
	fmt.Printf("余弦相似度：%.2f; ", cosineSimilarity)
}

// 计算余弦相似度的函数
func calculateCosineSimilarity(text1, text2 string) float64 {
	// 将文本转换为向量，每个单词或短语都表示为一个向量元素
	vector1 := make([]float64, len(text1)+len(text2))
	vector2 := make([]float64, len(text1)+len(text2))
	for i := range vector1 {
		vector1[i] = 0.0
		vector2[i] = 0.0
	}

	words := strings.Fields(text1)
	for i, _ := range words {
		vector1[len(text2)+i] = 1.0
	}
	words = strings.Fields(text2)
	for i, _ := range words {
		vector2[len(text2)+i] = 1.0
	}

	// 计算两个向量的点积并除以它们的范数乘积，得到余弦相似度
	dotProduct := dotProduct(vector1, vector2)
	norm1 := norm(vector1)
	norm2 := norm(vector2)
	similarity := dotProduct / (norm1 * norm2)
	return similarity
}

// 计算向量的点积函数
func dotProduct(vector1, vector2 []float64) float64 {
	sum := 0.0
	for i := range vector1 {
		sum += vector1[i] * vector2[i]
	}
	return sum
}

// 计算向量的范数函数（平方根和）
func norm(vector []float64) float64 {
	sumOfSquares := 0.0
	for i := range vector {
		sumOfSquares += math.Pow(vector[i], 2)
	}
	return math.Sqrt(sumOfSquares)
}
